package cn.zxinrun.wps.util;

import cn.zxinrun.core.exception.ServiceException;
import cn.zxinrun.core.util.StringUtils;
import com.aspose.words.*;
import lombok.extern.slf4j.Slf4j;

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;

/**
 * PDF 工具类
 * @author Mr.Zhang
 * @since 2025-08-10 22:33
 **/
@Slf4j
public class PdfUtils {

    private static final String LICENSE_STR = "<License><Data><Products><Product>Aspose.Total for Java</Product><Product>Aspose.Words for Java</Product></Products><EditionType>Enterprise</EditionType><SubscriptionExpiry>20991231</SubscriptionExpiry><LicenseExpiry>20991231</LicenseExpiry><SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber></Data><Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature></License>";

    /**
     * 将指定的 Word 文档（.docx）转换为 PDF 格式。
     * <p>
     * 该方法接收一个 Word 文件路径作为输入，并尝试将其内容转换为 PDF 格式，
     * 转换后的文件将保存在与原文件相同目录下，仅修改文件扩展名为 .pdf。
     * </p>
     * @param wordPath Word 文件的完整路径
     * @return 转换后的 PDF 文件路径
     */
    public static String convertToPdf(String wordPath) {
        if (StringUtils.isBlank(wordPath)) throw new ServiceException("word文件不允许为空!");
        log.info("[PDF工具]word文件地址为：{}", wordPath);
        // 生成的 word 文件地址
        String pdfPath;
        int dotIndex = wordPath.lastIndexOf(".docx");
        if (dotIndex != -1) {
            // 只替换最后一个 .docx
            pdfPath = wordPath.substring(0, dotIndex) + ".pdf";
        } else {
            pdfPath = wordPath + ".pdf";
        }

        try (InputStream license = new ByteArrayInputStream(LICENSE_STR.getBytes(StandardCharsets.UTF_8));
             FileOutputStream os = new FileOutputStream(pdfPath)) {
            // 设置 Aspose.Words 的许可证，避免水印或功能限制
            License asposeLic = new License();
            asposeLic.setLicense(license);

            // 设置字体目录，确保文档中使用的字体能正确渲染
//            FontSettings.setFontsFolder(TemplateUtils.getFolderPathFromTemplate("font"), false);

            // 加载 Word 文档
            Document doc = new Document(wordPath);
            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
            // 不对文本内容进行压缩，便于 PDF 内容复制
            pdfSaveOptions.setTextCompression(PdfTextCompression.NONE);
            // 对图片使用 JPEG 压缩格式，减小文件体积
            pdfSaveOptions.setImageCompression(PdfImageCompression.JPEG);
            // 禁用图像下采样，防止图像质量下降
            pdfSaveOptions.getDownsampleOptions().setDownsampleImages(false);
            // 设置 JPEG 图像质量为最高（100）
            pdfSaveOptions.setJpegQuality(100);
            // 自动选择图像颜色空间，以获得最佳显示效果
            pdfSaveOptions.setImageColorSpaceExportMode(PdfImageColorSpaceExportMode.AUTO);
            // 指定输出格式为 PDF
            pdfSaveOptions.setSaveFormat(SaveFormat.PDF);
            // 执行保存操作，将 Word 文档导出为 PDF 并写入到输出流
            doc.save(os, pdfSaveOptions);

            log.info("[PDF工具]转换完成，文件地址为: {}，总页数为: {}", pdfPath, doc.getPageCount());
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return pdfPath;
    }

}
